package cn.jw.starter.game.common.time;

import cn.hutool.core.date.DateUtil;
import cn.hutool.extra.spring.SpringUtil;
import cn.jw.starter.game.common.EnumGameCommonRedisKey;
import cn.jw.starter.redis.core.api.RedisApiService;
import jodd.util.StringUtil;
import lombok.extern.slf4j.Slf4j;

/**
 * 游戏世界时间系统工具类
 *
 * @author 王广帅
 * @version 1.0.0
 * @since 2025/7/18 23:33
 */
@Slf4j
public class GameWordTimeSystem {

    private static void updateOffsiteTime(String playerId, long offsiteTime) {
        RedisApiService redisApiService = SpringUtil.getBean(RedisApiService.class);
        redisApiService.setValue(EnumGameCommonRedisKey.GAME_WORLD_OFFSITE_TIME, playerId, String.valueOf(offsiteTime));
    }

    private static long getOffsiteTime(String playerId) {
        RedisApiService redisApiService = SpringUtil.getBean(RedisApiService.class);
        String value = redisApiService.getValue(EnumGameCommonRedisKey.GAME_WORLD_OFFSITE_TIME, playerId);
        long offsiteTime = 0;
        if (!StringUtil.isEmpty(value)) {
            offsiteTime = Long.parseLong(value);
        }
        log.debug("世界时间偏移量,playerId: {},offsiteTime: {}", playerId, offsiteTime);
        return offsiteTime;
    }

    /**
     * 设置某个角色的当前游戏时间，因为一个测试人员设置的时间，不能影响其它角色的正常时间
     *
     * @param playerId;
     * @param dateStr
     *            时间格式：yyyy-MM-dd HH:mm:ss
     */
    public static void setNowTime(String playerId, String dateStr) {
        // 计算当前时间与系统时间的偏移量、
        long systemTime = System.currentTimeMillis();
        long setTime = DateUtil.parseDateTime(dateStr).getTime();
        // 时间偏移量
        long offsite = setTime - systemTime;
        updateOffsiteTime(playerId, offsite);
    }

    /**
     * 获取一个用户的当前游戏时间
     *
     * @param playerId
     * @return
     */
    public static long getTime(String playerId) {
        long systemTime = System.currentTimeMillis();
        long offsiteTime = getOffsiteTime(playerId);
        return systemTime + offsiteTime;
    }

}
